import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class lianxi78 {
    import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

    public class Parser {
        //规定检索的路径
        private static final String INPUT_PATH = "C:\\搜索项目的java文档-检索\\docs\\api";
        //整个Parser类的入口
        public   void run(){
//根据上面的路径，枚举出里面的所有文档（递归）遍历，然后针对每一个路径进行解析，进行内容比对。把在内存构造好的放在数据结构中，然后返回
            ArrayList<File> fileList = new ArrayList<>();
            enumFile(INPUT_PATH,fileList);
//        System.out.println(fileList);
//        System.out.println(fileList.size());
            //针对上面罗列出的文件，打开文件，读取内容，进行解析，构建索引
            for(File f:fileList){
                System.out.println("开始解析"+f.getAbsolutePath());
                parseHTML(f);
            }
            //把在内存中构造好的索引数据结构保存到指定的文件中
        }

        private void parseHTML(File f) {
            //1.解析出HTML标题
            String title = parseTitle(f);
            //2.解析出HTML对应的URL
            String url = parseUrl(f);
            //3.解析出HTML对应的正文
            String content = parseContent(f);
            //4.把解析出来的这些信息，加入到索引当中
        }

        private String parseContent(File f) {
            //按照一个字符一个字符的读取，遇到< > 就不读取，设置开关，读取数据有通过字节和字符读取（FileInputStream,FileReader)
            try(FileReader fileReader = new FileReader(f);){
                //使用文件操作需要close（），try（）把打开文件自动关闭
                boolean isCopy = true;
                StringBuilder content = new StringBuilder();
                while(true){
                    //这里的read返回的是int，而不是char，按理说是一次读一个字符，就返回char够了呀，但是这里用int
                    //因为，int的值可以表示一些非法情况！，如果读到了末尾，就会返回-1之类的
                    int ret = fileReader.read();
                    if (ret == -1){
                        break;
                    }
                    //如果char不是-1，就是合法的字符
                    char c = (char) ret;
                    if(isCopy) {
                        if (c == '<') {
                            isCopy = false;
                            continue;
                        }
                        //表示换行的方式有两种，\n和回车
                        if(c == '\n' || c == '\r'){
                            c = ' ';
                        }
                        content.append(c);
                    } else {
                        if(c == '>'){
                            isCopy = true;
                        }
                    }
                }
                return content.toString();
            } catch (FileNotFoundException e) {
                throw new RuntimeException(e);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

        }

        private String parseUrl(File f) {
            String part1 = "https://docs.oracle.com/en/java/javase/22/docs/api";
            String part2 = f.getAbsolutePath().substring(INPUT_PATH.length());
            return part1 + part2;
        }

        private String parseTitle(File f) {
        }

        private void enumFile(String inputPath,ArrayList<File> fileList){
            File rootPath = new File(inputPath);
            //listFiles能够获取到rootPath当前目录下包含的文件/目录(只能看到一级目录）
            File[] files = rootPath.listFiles();
            //比用toString效果好，因为有分行，sout
            //System.out.println(Arrays.toString(files));
            for(File f:files){
                //根据当前f判断是不是文件，不是文件就继续递归，是文件就放到检索的地方
                if(f.isDirectory()){
                    enumFile(f.getAbsolutePath(),fileList);
                }
                else {
                    if(f.getAbsolutePath().endsWith(".html")) {
                        fileList.add(f);
                    }
                }
            }
        }
        //指定加载的路径
        public static void main(String[] args) {
            //通过main方法来创建索引过程
            Parser parser = new Parser();
            parser.run();
        }
    }

}
